home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
nethack.lha
/
nethack-3.1
/
src
/
mcastu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-14
|
9KB
|
365 lines
/* SCCS Id: @(#)mcastu.c 3.1 90/09/21
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
#ifdef OVL0
static void FDECL(cursetxt,(struct monst *));
const char *spelltyp[] = {
"shower of missiles",
"fireball",
"sleep ray",
"cone of cold",
"finger of death",
"bolt of lightning",
"",
"",
"",
""
};
static
void
cursetxt(mtmp)
register struct monst *mtmp;
{
if(canseemon(mtmp)) {
if ((Invis && !perceives(mtmp->data) &&
(mtmp->mux != u.ux || mtmp->muy != u.uy))
#ifdef POLYSELF
|| u.usym == S_MIMIC_DEF || u.uundetected
#endif
)
pline("%s points and curses in your general direction.",
Monnam(mtmp));
else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy))
pline("%s points and curses at your displaced image.",
Monnam(mtmp));
else
pline("%s points at you, then curses.", Monnam(mtmp));
} else if((!(moves%4) || !rn2(4)) && flags.soundok)
Norep("You hear a mumbled curse.");
}
#endif /* OVL0 */
#ifdef OVLB
int
castmu(mtmp, mattk) /* monster casts spell at you */
register struct monst *mtmp;
register struct attack *mattk;
{
int dmg, ml = mtmp->m_lev;
if(mtmp->mcan || mtmp->mspec_used || !ml) { /* could not attack */
cursetxt(mtmp);
return(0);
} else {
nomul(0);
if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) { /* fumbled attack */
if(canseemon(mtmp)
#ifdef SOUNDS
&& flags.soundok
#endif
)
pline("The air crackles around %s.", mon_nam(mtmp));
return(0);
}
}
/*
* As these are spells, the damage is related to the level
* of the monster casting the spell.
*/
if (mattk->damd)
dmg = d((int)((ml/3) + mattk->damn), (int)mattk->damd);
else dmg = d((int)((ml/3) + 1), 6);
if (Half_spell_damage) dmg = (dmg+1) / 2;
switch(mattk->adtyp) {
case AD_FIRE:
pline("You're enveloped in flames.");
if(Fire_resistance) {
shieldeff(u.ux, u.uy);
pline("But you resist the effects.");
dmg = 0;
}
break;
case AD_COLD:
pline("You're covered in frost.");
if(Cold_resistance) {
shieldeff(u.ux, u.uy);
pline("But you resist the effects.");
dmg = 0;
}
break;
case AD_MAGM:
You("are hit by a shower of missiles!");
if(Antimagic) {
shieldeff(u.ux, u.uy);
pline("The missiles bounce off!");
dmg = 0;
} else dmg = d((int)mtmp->m_lev/2 + 1,6);
break;
case AD_SPEL: /* random spell */
mtmp->mspec_used = 10 - mtmp->m_lev;
if (mtmp->mspec_used < 2) mtmp->mspec_used = 2;
switch(rn2((int)mtmp->m_lev)) {
case 22:
case 21:
case 20:
pline("Oh no, %s's using the touch of death!",
humanoid(mtmp->data)
? (mtmp->female ? "she" : "he")
: "it"
);
#ifdef POLYSELF
if (is_undead(uasmon))
You("seem no deader than before.");
else
#endif
if (!Antimagic && rn2(ml) > 12) {
if(Hallucination)
You("have an out of body experience.");
else {
killer_format = KILLED_BY_AN;
killer = "touch of death";
done(DIED);
}
} else {
if(Antimagic) shieldeff(u.ux, u.uy);
pline("Lucky for you, it didn't work!");
}
dmg = 0;
break;
case 19:
case 18:
if(mtmp->iswiz && flags.no_of_wizards == 1) {
pline("Double Trouble...");
clonewiz();
dmg = 0;
break;
} /* else fall into the next case */
case 17:
case 16:
case 15:
if(mtmp->iswiz)
verbalize("Destroy the thief, my pets!");
nasty(mtmp); /* summon something nasty */
/* fall into the next case */
case 14: /* aggravate all monsters */
case 13:
aggravate();
dmg = 0;
break;
case 12: /* curse random items */
case 11:
case 10:
rndcurse();
dmg = 0;
break;
case 9:
case 8: /* destroy armor */
if (Antimagic) {
shieldeff(u.ux, u.uy);
pline("A field of force surrounds you!");
} else if(!destroy_arm(some_armor()))
Your("skin itches.");
dmg = 0;
break;
case 7:
case 6: /* drain strength */
if(Antimagic) {
shieldeff(u.ux, u.uy);
You("feel momentarily weakened.");
} else {
You("suddenly feel weaker!");
dmg = ml - 6;
if(Half_spell_damage) dmg = (dmg+1) / 2;
losestr(rnd(dmg));
if(u.uhp < 1)
done_in_by(mtmp);
}
dmg = 0;
break;
case 5: /* make invisible if not */
case 4:
if(!mtmp->minvis) {
if(canseemon(mtmp) && !See_invisible)
pline("%s suddenly disappears!",
Monnam(mtmp));
mtmp->minvis = 1;
newsym(mtmp->mx,mtmp->my);
dmg = 0;
break;
} /* else fall into the next case */
case 3: /* stun */
if(Antimagic) {
shieldeff(u.ux, u.uy);
if(!Stunned)
You("feel momentarily disoriented.");
make_stunned(1L, FALSE);
} else {
if (Stunned)
You("struggle to keep your balance.");
else
You("reel....");
dmg = d(ACURR(A_DEX) < 12 ? 6 : 4, 4);
if(Half_spell_damage) dmg = (dmg+1) / 2;
make_stunned(HStun + dmg, FALSE);
}
dmg = 0;
break;
case 2: /* haste self */
if(mtmp->mspeed == MSLOW) mtmp->mspeed = 0;
else mtmp->mspeed = MFAST;
dmg = 0;
break;
case 1: /* cure self */
if(mtmp->mhp < mtmp->mhpmax) {
if((mtmp->mhp += rnd(8)) > mtmp->mhpmax)
mtmp->mhp = mtmp->mhpmax;
dmg = 0;
break;
} /* else fall through to default case */
default: /* psi bolt */
if(Antimagic) {
shieldeff(u.ux, u.uy);
You("get a slight %sache.",body_part(HEAD));
dmg = 1;
} else {
if (dmg <= 10)
Your("brain is on fire!");
else Your("%s suddenly aches!", body_part(HEAD));
}
break;
}
break;
case AD_CLRC: /* clerical spell */
mtmp->mspec_used = 10 - mtmp->m_lev;
if (mtmp->mspec_used < 2) mtmp->mspec_used = 2;
switch(rn2((int)mtmp->m_lev)) {
/* Other ideas: lightning bolts, towers of flame,
gush of water -3. */
default: /* confuse */
if(Antimagic) {
shieldeff(u.ux, u.uy);
You("feel momentarily dizzy.");
} else {
dmg = (int)mtmp->m_lev;
if(Half_spell_damage) dmg = (dmg+1) / 2;
make_confused(HConfusion + dmg, TRUE);
}
dmg = 0;
break;
case 12: /* curse random items */
case 11:
case 10:
rndcurse();
dmg = 0;
break;
case 9:
case 8: /* insects */
/* Try for insects, and if there are none
left, go for (sticks to) snakes. -3. */
{
int i;
struct permonst *pm = mkclass(S_ANT,0);
struct monst *mtmp2;
char let = (pm ? S_ANT : S_SNAKE);
for (i = 0; i <= (int) mtmp->m_lev; i++)
if ((pm = mkclass(let,0)) &&
(mtmp2 = makemon(pm, u.ux, u.uy))) {
mtmp2->msleep = mtmp2->mpeaceful =
mtmp2->mtame = 0;
set_malign(mtmp2);
}
}
dmg = 0;
break;
case 6:
case 7: /* blindness */
if (!Blinded) {
pline("Scales cover your eyes!");
make_blinded(Half_spell_damage ? 100L:200L, FALSE);
dmg = 0;
break;
}
case 4:
case 5: /* wound */
if(Antimagic) {
shieldeff(u.ux, u.uy);
Your("skin itches badly for a moment.");
dmg = 0;
} else {
pline("Wounds appear on your body!");
dmg = d(2,8) + 1;
if (Half_spell_damage) dmg = (dmg+1) / 2;
}
break;
case 3: /* hold */
if(Antimagic) {
shieldeff(u.ux, u.uy);
if(multi >= 0)
You("stiffen briefly.");
nomul(-1);
} else {
if (multi >= 0)
You("are frozen in place!");
dmg = 4 + (int)mtmp->m_lev;
if (Half_spell_damage) dmg = (dmg+1) / 2;
nomul(-dmg);
}
dmg = 0;
break;
case 2:
case 1: /* cure self */
if(mtmp->mhp < mtmp->mhpmax) {
if((mtmp->mhp += rnd(8)) > mtmp->mhpmax)
mtmp->mhp = mtmp->mhpmax;
dmg = 0;
break;
} /* else fall through to default case */
}
}
if(dmg) mdamageu(mtmp, dmg);
return(1);
}
#endif /* OVLB */
#ifdef OVL0
int
buzzmu(mtmp, mattk) /* monster uses spell (ranged) */
register struct monst *mtmp;
register struct attack *mattk;
{
if(mtmp->mcan || mattk->adtyp > AD_SPC2) {
cursetxt(mtmp);
return(0);
}
if(lined_up(mtmp) && rn2(3)) {
nomul(0);
if(mattk->adtyp && (mattk->adtyp < 11)) { /* no cf unsigned >0 */
if(canseemon(mtmp))
pline("%s zaps you with a %s!", Monnam(mtmp),
spelltyp[mattk->adtyp-1]);
buzz((int) (-10 - (mattk->adtyp-1)), (int)mattk->damn,
mtmp->mx, mtmp->my, sgn(tbx), sgn(tby));
} else impossible("Monster spell %d cast", mattk->adtyp-1);
}
return(1);
}
#endif /* OVL0 */
/*mcastu.c*/